package musika;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JButton;

public class EI_Ikasle {

	private JFrame frmMusikebal;
	private JLayeredPane pentLayer1 = new JLayeredPane();
	private int i1 = 109;
	private int i2 = 109;
	private int i3 = 109;
	private JLayeredPane pentLayer_2 = new JLayeredPane();
	private JLayeredPane pentLayer_3 = new JLayeredPane();
	private JRadioButton rdbtnPent1 = new JRadioButton("pent1");
	private JRadioButton rdbtnPent2 = new JRadioButton("pent2");
	private JRadioButton rdbtnPent3 = new JRadioButton("pent3");
	private int modifikadore1 = 0;
	private int modifikadore2 = 0;
	private int modifikadore3 = 0;
	JLabel lblOndo = new JLabel("");
	JLabel lblGaizki = new JLabel("");

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EI_Ikasle window = new EI_Ikasle();
					window.frmMusikebal.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public EI_Ikasle() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frameaSortu();

		pentagramakSortu();

		aukeraBotoiakSortu();

		menuBarraSortu();

		lblOndo.setIcon(new ImageIcon(EI_Ikasle.class
				.getResource("/musika/Tick-green.png")));
		lblOndo.setBounds(335, 469, 117, 93);
		frmMusikebal.getContentPane().add(lblOndo);
		lblOndo.setVisible(false);

		lblGaizki.setIcon(new ImageIcon(EI_Ikasle.class
				.getResource("/musika/gaizki.png")));
		lblGaizki.setBounds(335, 469, 117, 93);
		frmMusikebal.getContentPane().add(lblGaizki);
		lblGaizki.setVisible(false);

		frmMusikebal.setVisible(true);

	}

	public JFrame getFrmMusikebal() {
		return frmMusikebal;
	}

	/**
	 * Aukerak diren hiru pentagramak sortu.
	 * 
	 * @param erritmoa
	 *            : Parametro honek ariketaren erritmoa darama: 2/4,3/4 edo 4/4
	 */
	private void pentagramakSortu() {
		pentagramaSortu_1();

		pentagramaSortu_2();

		pentagramaSortu_3();
	}

	/**
	 * 3. pentagrama sortu
	 * 
	 * @param erritmoa
	 *            : Parametro honek ariketaren erritmoa darama: 2/4,3/4 edo 4/4
	 */
	private void pentagramaSortu_3() {
		JScrollPane pentScroll_3 = new JScrollPane();
		pentScroll_3.setBounds(22, 334, 672, 119);
		frmMusikebal.getContentPane().add(pentScroll_3);
		pentLayer_3.setPreferredSize(new Dimension(600, 500));

		pentLayer_3.setBackground(Color.WHITE);
		pentScroll_3.setViewportView(pentLayer_3);

		JLabel pentagrama_3 = new JLabel("");
		pentagrama_3.setIcon(new ImageIcon(EI_Irakasle.class
				.getResource("/musika/pentagrama.png")));
		pentagrama_3.setBounds(12, 14, 622, 92);
		pentLayer_3.add(pentagrama_3, pentLayer_3.DEFAULT_LAYER);

		JLabel lblErritmo3 = new JLabel("");
		erritmoIrudia(lblErritmo3);
		lblErritmo3.setBounds(65, 40, 20, 43);
		pentLayer_3.add(lblErritmo3, pentLayer_3.PALETTE_LAYER);

	}

	/**
	 * 2. pentagrama sortu
	 * 
	 * @param erritmoa
	 *            : Parametro honek ariketaren erritmoa darama: 2/4,3/4 edo 4/4
	 */
	private void pentagramaSortu_2() {
		JScrollPane pentScroll_2 = new JScrollPane();
		pentScroll_2.setBounds(22, 180, 672, 125);
		frmMusikebal.getContentPane().add(pentScroll_2);
		pentLayer_2.setPreferredSize(new Dimension(600, 500));

		pentLayer_2.setBackground(Color.WHITE);
		pentScroll_2.setViewportView(pentLayer_2);

		JLabel pentagrama_2 = new JLabel("");
		pentagrama_2.setIcon(new ImageIcon(EI_Irakasle.class
				.getResource("/musika/pentagrama.png")));
		pentagrama_2.setBounds(12, 12, 622, 98);
		pentLayer_2.add(pentagrama_2, pentLayer_2.DEFAULT_LAYER);

		JLabel lblErritmo2 = new JLabel("");
		erritmoIrudia(lblErritmo2);
		lblErritmo2.setBounds(65, 40, 20, 43);
		pentLayer_2.add(lblErritmo2, pentLayer_2.PALETTE_LAYER);

	}

	/**
	 * Emaitzaren pentagrama sortu
	 * 
	 * @param erritmoa
	 *            : Parametro honek ariketaren erritmoa darama: 2/4,3/4 edo 4/4
	 */
	private void pentagramaSortu_1() {
		JScrollPane pentScroll_1 = new JScrollPane();
		pentScroll_1.setBounds(22, 31, 672, 125);
		frmMusikebal.getContentPane().add(pentScroll_1);
		pentLayer1.setPreferredSize(new Dimension(600, 500));

		pentLayer1.setBackground(Color.WHITE);
		pentLayer1.setBounds(22, 31, 672, 125);
		pentScroll_1.setViewportView(pentLayer1);

		JLabel pentagrama_1 = new JLabel("");
		pentagrama_1.setIcon(new ImageIcon(EI_Irakasle.class
				.getResource("/musika/pentagrama.png")));
		pentagrama_1.setBounds(12, 12, 617, 97);
		pentLayer1.add(pentagrama_1, pentLayer1.DEFAULT_LAYER);

		JLabel lblErritmo1 = new JLabel("");
		erritmoIrudia(lblErritmo1);
		lblErritmo1.setBounds(65, 40, 20, 43);
		pentLayer1.add(lblErritmo1, pentLayer1.PALETTE_LAYER);

	}
/**
 * Leihoiaren framea sortzen du
 */
	private void frameaSortu() {
		Kudeatzailea k1 = Kudeatzailea.getInstantzia();
		frmMusikebal = new JFrame();

		// proba bezala erabili dut, beharbada aldatu, aldagai bezala pasatu
		// izena
		frmMusikebal.setTitle("MusikEbal - izenbururik gabeko artxiboa");

		frmMusikebal.setBounds(100, 100, 794, 641);
		frmMusikebal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmMusikebal.getContentPane().setLayout(null);
	}
/**
 * Erritmoaren irudia zein den definitzen du
 * @param labela setIcon egingo zaion labela
 */
	private void erritmoIrudia(JLabel labela) {
		Kudeatzailea k1 = Kudeatzailea.getInstantzia();

		int erritmoa = k1.getUnekoa().getErritmoa();

		if (erritmoa == 24) {
			labela.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/24.png")));
		} else if (erritmoa == 34) {

			labela.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/34.png")));

		} else {

			labela.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/44.png")));

		}

	}
/**
 * Ikasleak emaitza zein den pentagrama markatzeko erabiltzen dituen RadioButton-ak sortu
 */
	private void aukeraBotoiakSortu() {

		rdbtnPent1.setBounds(702, 86, 21, 23);
		rdbtnPent1.setSelected(true);
		frmMusikebal.getContentPane().add(rdbtnPent1);

		rdbtnPent2.setBounds(702, 242, 21, 23);
		frmMusikebal.getContentPane().add(rdbtnPent2);

		rdbtnPent3.setBounds(702, 387, 21, 23);
		frmMusikebal.getContentPane().add(rdbtnPent3);

		ButtonGroup botoiTalde = new ButtonGroup();
		botoiTalde.add(rdbtnPent1);
		botoiTalde.add(rdbtnPent2);
		botoiTalde.add(rdbtnPent3);

		JButton btnEntzun = new JButton("Entzun");
		btnEntzun.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				Kudeatzailea k1 = Kudeatzailea.getInstantzia();

				k1.midiSortu(k1.getEmaitza());
				k1.midiEntzun();
			}
		});
		btnEntzun.setBounds(627, 510, 117, 25);
		frmMusikebal.getContentPane().add(btnEntzun);

		JButton btnEmaitzaEman = new JButton("Emaitza eman!");
		btnEmaitzaEman.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				Kudeatzailea k1 = Kudeatzailea.getInstantzia();

				int ema = k1.getEmaitza();

				if (rdbtnPent1.isSelected() && ema == 0) {

					lblGaizki.setVisible(false);

					lblOndo.setVisible(true);

				} else if (rdbtnPent2.isSelected() && ema == 1) {

					lblGaizki.setVisible(false);

					lblOndo.setVisible(true);

				} else if (rdbtnPent3.isSelected() && ema == 2) {

					lblGaizki.setVisible(false);

					lblOndo.setVisible(true);

				} else {

					lblOndo.setVisible(false);

					lblGaizki.setVisible(true);

				}

			}
		});
		btnEmaitzaEman.setBounds(36, 510, 165, 25);
		frmMusikebal.getContentPane().add(btnEmaitzaEman);

	}
/**
 * Leihoaren menu Barra sortu
 */
	private void menuBarraSortu() {
		JMenuBar menuBar = new JMenuBar();
		frmMusikebal.setJMenuBar(menuBar);

		JMenu mnArtxiboa = new JMenu("Artxiboa");
		menuBar.add(mnArtxiboa);

		JMenuItem mntmIreki = new JMenuItem("Ireki...");
		mnArtxiboa.add(mntmIreki);
		mntmIreki.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Kudeatzailea k1 = Kudeatzailea.getInstantzia();

				String izena = k1.artxiboaIreki(true);
				frmMusikebal.setTitle("MusikEbal - " + izena);
				frmMusikebal.setVisible(false);

			}

		});
		
		JMenuItem mntmIrten = new JMenuItem("Irten");
		mnArtxiboa.add(mntmIrten);
		mntmIrten.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				System.exit(-1);

			}

		});
		

	}

	/**
	 * Fitxategi bat kargatzean notak margotzeko metodoa
	 * @param pentagrama
	 * @param konp
	 * @param nota1
	 */

	public void notaMargotuKargatzean(int pentagrama, Konpasa konp, Nota nota1) {

		int alterazioa = nota1.getAlterazioa();
		Kudeatzailea kud = Kudeatzailea.getInstantzia();
		String nota = nota1.getNota();
		int luzapen = nota1.getLuzapena();

		if (pentagrama == 0) {

			i1 = margotzeanZerKalkuloak(nota, i1, pentLayer1, pentagrama,
					modifikadore1, kud, nota1, konp, alterazioa, luzapen);
			if (i1 >= 619) {

				modifikadore1 = pentagramaBerria(modifikadore1, pentLayer1, i1);
				i1 = 109;
			}

		} else if (pentagrama == 1) {

			i2 = margotzeanZerKalkuloak(nota, i2, pentLayer_2, pentagrama,
					modifikadore2, kud, nota1, konp, alterazioa, luzapen);

			if (i2 >= 619) {

				modifikadore2 = pentagramaBerria(modifikadore2, pentLayer_2, i2);
				i2 = 109;
			}

		} else if (pentagrama == 2) {

			i3 = margotzeanZerKalkuloak(nota, i3, pentLayer_3, pentagrama,
					modifikadore3, kud, nota1, konp, alterazioa, luzapen);

			if (i3 >= 619) {

				modifikadore3 = pentagramaBerria(modifikadore3, pentLayer_3, i3);
				i3 = 109;
			}

		}

	}
/**
 * Pentagrama berria marotzeko metodoa
 * @param modifikadore
 * @param panela
 * @param indizea
 * @return
 */
	private int pentagramaBerria(int modifikadore, JLayeredPane panela,
			int indizea) {

		modifikadore = modifikadore + 97;
		JLabel pentagrama_1 = new JLabel("");
		pentagrama_1.setIcon(new ImageIcon(EI_Irakasle.class
				.getResource("/musika/pentagrama.png")));
		pentagrama_1.setBounds(12, 12 + modifikadore, 617, 97);
		panela.add(pentagrama_1, panela.DEFAULT_LAYER);

		return modifikadore;
	}

	/**
	 * metodo honek nota margotu egiten du eta datu egituran sartu egiten du.
	 * Konpasa beteta dagoen ala ez kalkulatzen du, eta honen tamaina
	 * gehiegizkoa den ala ez ere.
	 * 
	 * @param nota
	 * @param indize
	 * @param panela
	 * @param aukeratuta
	 * @param modifikadore
	 * @param k1
	 * @param nota1
	 * @param konp
	 * @param alterazioa
	 * @param luzapen
	 * @return
	 */
	private int margotzeanZerKalkuloak(String nota, int indize,
			JLayeredPane panela, int aukeratuta, int modifikadore,
			Kudeatzailea k1, Nota nota1, Konpasa konp, int alterazioa,
			int luzapen) {

		int uni = konp.getUnitateak();

		if (uni - luzapen < 0) {

			// errore

			new EI_ErroreKonpasTamaina();

		} else if (uni - luzapen == 0) {

			// nota gehitu eta konpasa itxi
			if (nota.equalsIgnoreCase("isilunea")) {

				isiluneaMargotu(figuraIsilune(luzapen), panela, indize,
						modifikadore);

			} else {
				notaMargotu(nota, figuraIrudi(luzapen), panela, indize,
						modifikadore, alterazioa, luzapen);
			}

			indize = indize + 30;

			konp.getNotak().add(nota1);

			konp.setUnitateak(0);

			// Konpas berria sortu
			Konpasa konp1 = new Konpasa(k1.getUnekoa().getErritmoa());

			k1.getUnekoa().getPentagramak().get(aukeratuta).getKonpasak().add(
					konp1);
			// Konpas marra marraztu
			JLabel konpasmarra = new JLabel("");
			konpasmarra.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/konpasa.png")));
			konpasmarra.setBounds(indize, 36 + modifikadore, 20, 55);
			panela.add(konpasmarra, panela.PALETTE_LAYER);

			indize = indize + 30;

		} else if (uni - luzapen > 0) {
			// nota gehitu

			if (nota.equalsIgnoreCase("isilunea")) {

				isiluneaMargotu(figuraIsilune(luzapen), panela, indize,
						modifikadore);

			} else {
				notaMargotu(nota, figuraIrudi(luzapen), panela, indize,
						modifikadore, alterazioa, luzapen);
			}
			indize = indize + 30;

			konp.getNotak().add(nota1);

			konp.setUnitateak(uni - luzapen);

		}

		return indize;
	}
/**
 * Figura baten irudia kalkulatzeko metodoa
 * @param luzapen
 * @return
 */
	public String figuraIrudi(int luzapen) {
		String irudi = null;

		if (luzapen == 32) {

			irudi = "/musika/borobila";

		} else if (luzapen == 16) {

			irudi = "/musika/txuria";

		} else if (luzapen == 8) {

			irudi = "/musika/beltza";

		} else if (luzapen == 4) {

			irudi = "/musika/kortxea";

		} else if (luzapen == 2) {

			irudi = "/musika/semikortxea";

		} else if (luzapen == 1) {

			irudi = "/musika/fusa";

		}

		return irudi;

	}

	/**
	 * Metodo honi deitzean, marraztuko den isilunearen irudia aukeratu egiten
	 * du.
	 * 
	 * @return irudiaren PATH
	 */
	public String figuraIsilune(int luzapen) {
		String irudi = null;

		if (luzapen == 32) {

			irudi = "/musika/silencioborobil.png";

		} else if (luzapen == 16) {

			irudi = "/musika/silenciotxuria.png";

		} else if (luzapen == 8) {

			irudi = "/musika/silenciobeltza.png";

		} else if (luzapen == 4) {

			irudi = "/musika/silenciokortxea.png";

		} else if (luzapen == 2) {

			irudi = "/musika/silenciosemi.png";

		} else if (luzapen == 1) {

			irudi = "/musika/silenciofusa.png";

		}

		return irudi;

	}

	/**
	 * Metodo honek notaren labela sortu egiten du, eta honek daramatzan
	 * baldintza guztiak, do bada marra marraztu, sostenidoak eta bemolak, eta
	 * notaren koordenadak pentagraman kalkulatu egiten ditu.
	 * 
	 * @param nota
	 *            : Notaren izena
	 * @param irudi
	 *            : Notaren irudiaren PATH-a
	 * @param panela
	 *            : Nota jarriko den panela.
	 * @param X
	 *            : Notaren X koordenatua pentagraman.
	 * @param modifikadore
	 *            : Y koordenatuaren modifikadorea, pentagrama zuzenean margotu
	 *            dadin.
	 * @param alterazioa
	 *            : Notak sostenidoa edo bemola daraman parametroa.
	 */
	public void notaMargotu(String nota, String irudi, JLayeredPane panela,
			int X, int modifikadore, int alterazioa, int luzapen) {

		int koord = 0;
		// klikaren koordenatua - irudiaren tamaina (33)
		if (nota.equalsIgnoreCase("do")) {

			koord = 94 - 35 + modifikadore;

			JLabel domarra = new JLabel("");
			domarra.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/domarra.png")));
			domarra.setBounds(X - 3, koord + 11, 34, 47);
			panela.add(domarra, panela.DRAG_LAYER);

		} else if (nota.equalsIgnoreCase("re")) {

			koord = 89 - 35 + modifikadore;
		} else if (nota.equalsIgnoreCase("mi")) {

			koord = 84 - 35 + modifikadore;
		} else if (nota.equalsIgnoreCase("fa")) {

			koord = 79 - 35 + modifikadore;
		} else if (nota.equalsIgnoreCase("sol")) {

			koord = 73 - 35 + modifikadore;
		} else if (nota.equalsIgnoreCase("la")) {

			koord = 66 - 35 + modifikadore;
		} else if (nota.equalsIgnoreCase("si")) {

			koord = 61 - 35 + modifikadore;
		}else if (nota.equalsIgnoreCase("do2")) {

			koord = 56 - 14 + modifikadore;
		} else if (nota.equalsIgnoreCase("re2")) {

			koord = 51 -14  + modifikadore;
		} else if (nota.equalsIgnoreCase("mi2")) {

			koord = 47 -16  + modifikadore;
		} else if (nota.equalsIgnoreCase("fa2")) {

			koord = 43 -19  + modifikadore;
		} else if (nota.equalsIgnoreCase("sol2")) {

			koord = 39  -19 + modifikadore;
		} else if (nota.equalsIgnoreCase("la2")) {

			koord = 35  -19 + modifikadore;
			
			JLabel domarra = new JLabel("");
			domarra.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/domarra.png")));
			domarra.setBounds(X-1, koord - 12, 34, 47);
			panela.add(domarra, panela.DRAG_LAYER);
			domarra.setName("domarra");
	
			
		} else if (nota.equalsIgnoreCase("si2")) {

			koord = 31  -19 + modifikadore;
			
			JLabel domarra = new JLabel("");
			domarra.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/domarra.png")));
			domarra.setBounds(X-1, koord - 7, 34, 47);
			panela.add(domarra, panela.DRAG_LAYER);
			domarra.setName("domarra");

			
			
		}


		if (luzapen == 32) {
			koord = koord + 11;

		}

		if (alterazioa == 2) {

			JLabel alt = new JLabel("");
			alt.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/sostenido.png")));
			if (nota.contains("2")){
				
				alt.setBounds(X - 11, koord - 8 , 34, 47);
				
			}else{
				
				alt.setBounds(X - 11, koord + 10 , 34, 47);
				
			}
			
			panela.add(alt, panela.DRAG_LAYER);
			alt.setName("alt");
	

		} else if (alterazioa == 1) {

			JLabel alt = new JLabel("");
			alt.setIcon(new ImageIcon(EI_Irakasle.class
					.getResource("/musika/bemol.png")));
			
			if (nota.contains("2")){
				
				alt.setBounds(X - 12, koord - 9, 34, 47);
				
			}else{
				
				alt.setBounds(X - 12, koord + 9, 34, 47);
				
			}

			panela.add(alt, panela.DRAG_LAYER);
			alt.setName("alt");

		}
		
		if (nota.contains("2")){
			
			irudi = irudi + "2.png";
			System.out.println(irudi);
			
		}else{
			
			irudi = irudi + ".png";
			
		}

		JLabel nota1 = new JLabel("");
		nota1.setIcon(new ImageIcon(EI_Irakasle.class.getResource(irudi)));
		nota1.setBounds(X, koord, 34, 47);
		panela.add(nota1, panela.MODAL_LAYER);

	}

	/**
	 * Metodo honek isilunearen labela marrazten du.
	 * 
	 * @param irudi
	 *            : Isilunea irudiaren PATH-a
	 * @param panela
	 *            : Isilunea jarriko den panela.
	 * @param X
	 *            : Isilunea marrazteko X koordenatua
	 * @param modifikadore
	 *            : Y koordenatuaren modifikadorea.
	 */
	public void isiluneaMargotu(String irudi, JLayeredPane panela, int X,
			int modifikadore) {

		JLabel nota1 = new JLabel("");
		nota1.setIcon(new ImageIcon(EI_Irakasle.class.getResource(irudi)));
		nota1.setBounds(X, 35 + modifikadore, 34, 47);
		panela.add(nota1, panela.MODAL_LAYER);

	}
/**
 * Pentagramaren bukaera marra margotzeko metodoa
 * @param indize
 */
	public void bukaeraMarra(int indize) {

		int ind = 0;
		JLayeredPane panela = null;
		int modifikadore=0;

		if (indize == 0) {
			ind = i1;
			panela = pentLayer1;
			modifikadore=modifikadore1;

		} else if (indize == 1) {

			ind = i2;
			panela = pentLayer_2;
			modifikadore=modifikadore2;

		} else if (indize == 2) {

			ind = i3;
			panela = pentLayer_3;
			modifikadore=modifikadore3;

		}
		
		

		JLabel bukaeramarra = new JLabel("");
		bukaeramarra.setIcon(new ImageIcon(EI_Irakasle.class
				.getResource("/musika/bukaera.png")));
		bukaeramarra.setBounds(ind - 25, 36 + modifikadore, 20, 55);
		panela.add(bukaeramarra, panela.PALETTE_LAYER);

	}
}
